package org.dtrd.modules.util;

import org.dtrd.common.util.StringUtil;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 数学工具类
 * 
 * @author zhc@tangys.net
 * @version
 * @since 2018年5月14日
 */
public class MathUtil {
	/**
	 * 
	 * 功能描述：从数组中随机抽取若干不重复元素
	 * 
	 * @param paramArray:被抽取数组
	 * @param count:抽取元素的个数
	 * @return:由抽取元素组成的新数组
	 * @author zhucheng
	 * @since 2018年5月14日
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static Object[] getRandomArray(Object[] paramArray, int count) {
		if (paramArray.length < count) {
			return paramArray;
		}
		Object[] newArray = new Object[count];
		Random random = new Random();
		int temp = 0;// 接收产生的随机数
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 1; i <= count; i++) {
			temp = random.nextInt(paramArray.length);// 将产生的随机数作为被抽数组的索引
			if (!(list.contains(temp))) {
				newArray[i - 1] = paramArray[temp];
				list.add(temp);
			} else {
				i--;
			}
		}
		return newArray;
	}

	/**
	 * 
	 * 功能描述：从整数数值中取出指定范围到最大的随机整数
	 * 
	 * @param num
	 *            指定整数
	 * @param range
	 *            从指定整数的百分比数值开始随机
	 * @return
	 * @author zhucheng
	 * @since 2018年6月12日
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static int getDesignatedRandom(int num, int range) {
		if (range < 0 || range > 100) {
			return num;
		}
		Random rand = new Random();
		int start = num * range / 100;
		int result = rand.nextInt(num - start + 1) + start;
		return result;
	}

	/**
	 * 计算百分比
	 * 
	 * @param value
	 * @param count
	 * @return
	 * @author xiao
	 * @since 2018年5月23日上午11:23:55
	 * @update [变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static Float calculatePercentage(double value, double count) {
		float result = 0f;
		if (value > 0 && count > 0) {
			if (value == count) {
				result = 100;
			} else {
				result = new BigDecimal((value * 100) / count).setScale(1, RoundingMode.HALF_UP).floatValue();
			}
		}
		return result;
	}

	/**
	 * 百分比格式化
	 * 
	 * @param value
	 * @param len
	 *            小数点后位数 0 整型 1 一位小数 。。。
	 * @author xiao
	 * @since 2018年5月23日下午4:24:24
	 * @update [变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	public static String formatPercentage(double value, int len) {
		String format;
		switch (len) {
		case 0:
			format = "#";
			break;
		case 1:
			format = "#.0";
			break;
		case 2:
			format = "#.00";
			break;
		default:
			format = "#.#";
			break;
		}
		String str = StringUtil.formatnum(value, format);
		return String.format("%s%%", str);
	}

	public static void main(String[] args) {
		// count=13, patientId=10000039, lowCounts=2, normalCounts=6, highCounts=5
		double total = 13;
		int scale = 1;
		Float calculatePercentage = calculatePercentage(2, total);
		System.out.println(calculatePercentage);
		Float calculatePercentage1 = calculatePercentage(6, total);
		System.out.println(calculatePercentage1);
		Float calculatePercentage2 = calculatePercentage(5, total);
		System.out.println(calculatePercentage2);
		// String formatPercentage = formatPercentage(43.123, 1);
		// String formatPercentage1 = formatPercentage(43.123, 0);
		// String formatPercentage2 = formatPercentage(43.123, 2);
		// System.out.println(formatPercentage + ";" + formatPercentage1 + ";" +
		// formatPercentage2);
		// System.out.println(getDesignatedRandom(2000, 80));
	}
}
